//go:build linux
// +build linux

package service

import (
	"fmt"
	"os"

	"gitee.com/liumou_site/glbm"
	"gitee.com/liumou_site/logger"
)

// LinuxService Linux系统服务管理结构体
// 与WindowsService保持相同的设计模式
// 使用结构体方式统一管理Linux systemd服务
// 包含服务名称、间隔时间和systemd配置文件路径
// 提供创建、移除等统一接口
// 使用glbm库进行底层systemd操作
type LinuxService struct {
	Name        string
	Interval    int
	ServiceFile string // systemd服务文件完整路径
}

// NewServiceLinux 创建新的Linux服务实例
// 初始化服务名称和systemd配置文件路径
// 与NewServiceWindows保持一致的设计
func NewServiceLinux(name string, interval int) *LinuxService {
	return &LinuxService{
		Name:        name,
		Interval:    interval,
		ServiceFile: fmt.Sprintf("/usr/lib/systemd/system/%s.service", name),
	}
}

// Create 创建并配置Linux systemd服务
// 实现与WindowsService.Create相同的接口
// 使用glbm库进行systemd服务管理
// 优化文件路径处理，直接使用结构体中记录的路径
func (s *LinuxService) Create() error {
	logger.Info("正在创建Linux systemd服务: %s", s.Name)

	// 确保服务文件在正确位置
	servicePath, err := EnsureServiceFile()
	if err != nil {
		logger.Error("服务文件准备失败: %v", err)
		return err
	}

	// 创建glbm服务实例
	systemdService := glbm.NewService(s.Name, "run")

	// 检查服务是否已存在
	if systemdService.Exists() {
		logger.Info("服务已存在: %s", s.Name)
		return nil
	}

	// 检查服务文件是否存在（使用结构体记录的路径）
	if _, err = os.Stat(s.ServiceFile); !os.IsNotExist(err) {
		logger.Info("服务文件已存在: %s", s.ServiceFile)
		return nil
	}

	// 构建服务文件内容
	serviceContent := fmt.Sprintf(`[Unit]
Description=PasswordReset Service - %s
After=network.target
StartLimitIntervalSec=5

[Service]
Type=simple
User=root
ExecStart=%s -hour=%d


StandardOutput=journal
KillMode=control-group
Restart=on-failure
RestartPreventExitStatus=255
StandardError=inherit

[Install]
WantedBy=multi-user.target
Alias=%s.service
`, s.Name, servicePath, s.Interval, s.Name)
	fmt.Println(serviceContent)
	// 写入服务文件（使用结构体记录的路径）
	err = os.WriteFile(s.ServiceFile, []byte(serviceContent), 0644)
	if err != nil {
		logger.Error("创建服务文件失败: %v", err)
		return err
	}

	// 重新加载systemd配置并启用服务
	systemdService.ReLoadDaemon().Enable().Start()
	if systemdService.Err != nil {
		logger.Error("服务配置失败: %v", systemdService.Err)
		return systemdService.Err
	}

	logger.Info("Linux服务创建成功: %s", s.Name)
	return nil
}

// Remove 移除Linux systemd服务
// 实现与WindowsService.Remove相同的接口
// 使用glbm库管理服务，只在删除文件时使用Cmd运行命令
func (s *LinuxService) Remove() error {
	logger.Info("正在移除Linux systemd服务: %s", s.Name)

	// 创建glbm服务实例
	systemdService := glbm.NewService(s.Name, "")

	// 停止并禁用服务
	systemdService.Stop().Disable()
	if systemdService.Err != nil {
		logger.Warn("停止/禁用服务时出现问题: %v", systemdService.Err)
	}

	// 删除服务文件（使用结构体记录的路径）
	if err := os.Remove(s.ServiceFile); err != nil && !os.IsNotExist(err) {
		logger.Warn("删除服务文件失败: %v", err)
		return err

	}

	// 重新加载systemd配置
	systemdService.ReLoadDaemon()

	logger.Info("Linux服务移除完成: %s", s.Name)
	return nil
}
